home *** CD-ROM | disk | FTP | other *** search
/ Aminet 6 / Aminet 6 - June 1995.iso / Aminet / comm / bbs / nim_v0_9.lha / nim.bas < prev    next >
Encoding:
BASIC Source File  |  1991-01-11  |  24.8 KB  |  934 lines

  1. REM ******************************************************************
  2.  
  3. REM Program- NIM
  4. REM    Date- 4 January 1990
  5. REM  Author- Peter Francis Deane
  6. REM
  7. REM Version- 0.8
  8.  
  9. REM ******************************************************************
  10.  
  11.  
  12. CLEAR ,50000&
  13. 3 CLEAR:DEFLNG b-z:DEFSNG a:DIM L$(20),D$(20),N$(26),U(50):cr$=CHR$(13)+CHR$(10):de$=CHR$(8)+" "+CHR$(8):null$=CHR$(0):esc$=CHR$(27):ON TIMER(30) GOSUB sendnull
  14.  
  15.  
  16. 5 CLOSE#2:OPEN "I",#2,"RAM:USERDATA":LINE INPUT#2,tpc$:LINE INPUT#2,uname$:LINE INPUT#2,id$:LINE INPUT#2,lev$:LINE INPUT#2,bd$:LINE INPUT#2,ring$:LINE INPUT#2,path$:CLOSE#2
  17. REM 5 tpc$="30":id$="1":lev$="9":ring$="0":bd$="2400":uname$="PETER DEANE":path$="WB:Basic/Metro/"
  18.  
  19. 10 tpc=VAL(tpc$):id=VAL(id$):lev=VAL(lev$):ring=VAL(ring$):TITLE$="NIM V0.9 - User: "+uname$+" (#"+STR$(id)+") Lev:"+STR$(lev)+"  Baud:"+bd$
  20.  
  21.  
  22. REM ******************************************************************
  23. Start:
  24. REM ******************************************************************
  25.  
  26. timeon=TIMER:GOSUB modem.o:GOSUB delay1:RANDOMIZE TIMER:WINDOW 1,TITLE$,(0,0)-(617,185),23,-1:WINDOW OUTPUT 1
  27.  
  28. ON ERROR GOTO Woops
  29.  
  30. DIM ansi$(10)
  31.  
  32. o$=cr$+"NIM - a two-player game for Metro BBS":GOSUB modem.out
  33. o$=cr$+"By Peter Deane (Inquestor BBS - Waratah, NSW, Australia)":GOSUB modem.out
  34. o$=cr$+cr$+"Version 0.9"+cr$:GOSUB modem.out
  35.  
  36. GOSUB AnsiCheck
  37. GOSUB IBMCheck
  38. o$=cr$+cr$+cr$+"Setting up. Won't take a sec..":GOSUB modem.out
  39. DIM a$(8)
  40. DIM b$(8)
  41.  
  42.   ' a$(0)=Winner Index
  43.   ' a$(1)=Player 1 ID
  44.   ' a$(2)=Player 1 Name
  45.   ' a$(3)=Player 2 ID
  46.   ' a$(4)=Player 2 Name
  47.   ' a$(5)=Date of Last Go
  48.   ' a$(6)=Whose next go (ID#) - 
  49.   '       OR IF game over - the ID of the winner.
  50.   ' a$(7)=How many objects left!
  51.   ' a$(8)=Game Status:
  52.   '
  53.   '       0= Game Waiting  1= 1 player signed up
  54.   '       2= IN PROGRESS   3= Over, but still displaying (set this in config)
  55.   
  56. REM read in config
  57.  
  58. flnm$=path$+"nim.config"
  59. o$=".....":GOSUB modem.out
  60.  
  61. OPEN flnm$ FOR INPUT AS 2
  62.   LINE INPUT #2, maxgames$
  63.   maxgames=VAL(maxgames$)
  64.   LINE INPUT #2, password$
  65.   password$=UCASE$(password$)
  66.   LINE INPUT #2, displaytimes$
  67.   displaytimes=VAL(displaytimes$)
  68. CLOSE #2
  69.  
  70. o$=".....":GOSUB modem.out
  71. DIM player(maxgames)
  72.  
  73. REM Have a look for games to clear, and update the counters...
  74.  
  75. GOSUB opengames
  76. FOR J=1 TO 99 
  77. GET #2, J
  78.  
  79. REM An inactive game!
  80. IF VAL(a$(8))=3 THEN
  81.      FOR k=0 TO 8
  82.        b$(k)=a$(k)
  83.      NEXT
  84.      adead=VAL(b$(0))
  85.      IF adead>displaytimes THEN
  86.        b$(0)="0"  
  87.        b$(8)="0"
  88.      ELSE   
  89.        adead=adead+1
  90.        b$(0)=STR$(adead)
  91.      END IF
  92.      FOR k=0 TO 8
  93.        LSET a$(k)=b$(k)
  94.      NEXT k
  95.      PUT #2,J
  96.   END IF
  97. NEXT J
  98. CLOSE #2
  99. o$=".....":GOSUB modem.out
  100.  
  101. GOSUB CheckNoGames
  102. o$=".....":GOSUB modem.out
  103.  
  104. GOSUB About
  105. GOSUB ClearScreen
  106. o$=cr$+ansi$(6)+"You are involved in"+STR$(nogames)+" games.":GOSUB modem.out
  107.  
  108. REM ******************************************************************
  109. topmenu:
  110. REM ******************************************************************
  111.  
  112. in$=""
  113. GOSUB TimeCheck
  114. o$=cr$+cr$+cr$:GOSUB modem.out
  115. o$=cr$+ansi$(1)+TIME$+ansi$(5)+" - Options: <P>-<J>-<B>-<S>-<Y>-<V>-<I>-<A>-<C>-<M>-<Q> [?=Menu]: ":GOSUB modem.out
  116. in=0:il=1:GOSUB modem.in
  117.  
  118. IF in$="P" THEN GOSUB PlayGame
  119. IF in$="J" THEN GOSUB join
  120. IF in$="B" THEN GOSUB begin
  121. IF in$="S" THEN GOSUB status
  122. IF in$="Y" THEN GOSUB YourStat
  123. IF in$="V" THEN GOSUB View
  124. IF in$="I" THEN GOSUB instruct
  125. IF in$="A" THEN GOSUB About
  126. IF in$="C" THEN GOSUB ChangeSetup
  127. IF in$="M" THEN GOSUB Maintenance
  128. IF in$="Q" THEN GOTO quit
  129. IF in$="?" THEN GOSUB PrintMenu
  130.  
  131. GOTO topmenu
  132.  
  133. REM ******************************************************************
  134. PlayGame:
  135. REM ******************************************************************
  136.  
  137. GOSUB ClearScreen
  138. GOSUB opengames
  139. o$=cr$+ansi$(5)+"It is your turn in these games:-":GOSUB modem.out
  140. o$=cr$+cr$+ansi$(3)+"Game  Opponent                   Date Last Move  Objects Left":GOSUB modem.out
  141. o$=cr$+ansi$(1)+"~~~~  ~~~~~~~~                   ~~~~~~~~~~~~~~  ~~~~~~~~~~~~":GOSUB modem.out
  142. count=0
  143.  
  144. FOR k=1 TO maxgames
  145. player(k)=0
  146. NEXT
  147.  
  148. FOR k=1 TO 99
  149.   GET #2, k
  150.   IF VAL(a$(8))<>2 THEN NahNextOne
  151.   IF VAL(a$(1))=id THEN InIt
  152.   IF VAL(a$(3))=id THEN InIt
  153.   GOTO NahNextOne
  154.   
  155. InIt:
  156. IF VAL(a$(6))<>id THEN NahNextOne
  157.  
  158.   count=count+1
  159.   IF count>maxgames THEN NahNextOne
  160.   player(count)=k
  161.   o$=cr$+ansi$(2)+STR$(k)
  162.   IF k<10 THEN o$=o$+" "
  163.   o$=o$+"   "+ansi$(5)
  164.   IF VAL(a$(1))=id THEN o$=o$+a$(4)+SPACE$(27-LEN(a$(4)))
  165.   IF VAL(a$(3))=id THEN o$=o$+a$(2)+SPACE$(27-LEN(a$(2)))
  166.   o$=o$+ansi$(6)+a$(5)+"      "+ansi$(3)+a$(7)
  167.   GOSUB modem.out
  168.    
  169. NahNextOne:
  170. NEXT
  171.  
  172. CLOSE #2
  173.  
  174. total=0
  175.  
  176. FOR k=1 TO maxgames
  177.   total=total+player(k)
  178. NEXT
  179.  
  180. IF total=0 THEN o$=cr$+cr$+ansi$(2)+"Oh dear, it's not your turn in ANY of the games!":GOSUB modem.out:GOTO FinishPlay
  181. o$=cr$+cr$+ansi$(1)+"Which game shall it be? (0 to Abort) ":GOSUB modem.out
  182. in=4:il=2:GOSUB modem.in
  183.  
  184. IF VAL(in$)<1 THEN GOTO FinishPlay
  185.  
  186. FOR k=1 TO maxgames
  187.   IF VAL(in$)=player(k) THEN Playing=VAL(in$):GOTO ValidGame
  188. NEXT
  189. o$=cr$+cr$+ansi$(2)+"Sorry, it's not your turn in game #"+in$:GOSUB modem.out
  190. GOTO PlayGame
  191.  
  192. ValidGame:
  193.   
  194. GOSUB ClearScreen
  195. GOSUB opengames
  196.  
  197. GET #2,Playing
  198. NoLeft=VAL(a$(7))
  199.  
  200. flnm$=path$+"GameImgs/Nim"+STR$(NoLeft)
  201. IF ansi=1 THEN flnm$=flnm$+".1" ELSE flnm$=flnm$+".0"
  202. IF  ibm=1 THEN flnm$=flnm$+".1" ELSE flnm$=flnm$+".0"
  203. GOSUB fileout
  204.  
  205. HowMany:
  206. o$=cr$+cr$+ansi$(5)+"There are "+STR$(NoLeft)+" objects remaining.":GOSUB modem.out
  207. o$=cr$+cr$+ansi$(7)+"Remove how many objects (1-3)? ":GOSUB modem.out
  208. in=4:il=1:GOSUB modem.in
  209. Remove=VAL(in$)
  210. IF Remove<1 OR Remove>3 THEN HowMany
  211. NoLeft=NoLeft-Remove
  212. IF NoLeft<1 THEN GOTO LoseGame
  213. IF NoLeft>1 THEN GOTO NextTurn
  214.  
  215. REM WON!!
  216.  
  217. flnm$=path$+"Nim.Won"
  218. IF ansi=1 THEN flnm$=flnm$+".1" ELSE flnm$=flnm$+".0"
  219. IF  ibm=1 THEN flnm$=flnm$+".1" ELSE flnm$=flnm$+".0"
  220. GOSUB fileout
  221.  
  222. LSET a$(0)="1"
  223. LSET a$(5)=DATE$
  224. IF VAL(a$(1))=id THEN LSET a$(6)=a$(1)
  225. IF VAL(a$(3))=id THEN LSET a$(6)=a$(3)
  226. LSET a$(7)="0"
  227. LSET a$(8)="3"
  228.  
  229. PUT #2,Playing
  230. GOTO FinishPlay
  231.  
  232. NextTurn:
  233. GOSUB ClearScreen
  234.  
  235. flnm$=path$+"GameImgs/Nim"+STR$(NoLeft)
  236. IF ansi=1 THEN flnm$=flnm$+".1" ELSE flnm$=flnm$+".0"
  237. IF  ibm=1 THEN flnm$=flnm$+".1" ELSE flnm$=flnm$+".0"
  238. GOSUB fileout
  239. o$=cr$+cr$+ansi$(5)+"There are NOW"+STR$(NoLeft)+" objects remaining.":GOSUB modem.out
  240. o$=cr$+cr$+ansi$(7)+"Now, all you gotta do is wait for the other guy to play":GOSUB modem.out
  241. LSET a$(5)=DATE$
  242. IF VAL(a$(1))=id THEN LSET a$(6)=a$(3)
  243. IF VAL(a$(3))=id THEN LSET a$(6)=a$(1)
  244. LSET a$(7)=STR$(NoLeft)
  245.  
  246. PUT #2, Playing
  247. GOTO FinishPlay
  248.  
  249. LoseGame:
  250. GOSUB ClearScreen
  251. flnm$=path$+"Nim.Lost"
  252. IF ansi=1 THEN flnm$=flnm$+".1" ELSE flnm$=flnm$+".0"
  253. IF  ibm=1 THEN flnm$=flnm$+".1" ELSE flnm$=flnm$+".0"
  254. GOSUB fileout
  255.  
  256. LSET a$(0)="1"
  257. LSET a$(5)=DATE$
  258. IF VAL(a$(1))=id THEN LSET a$(6)=a$(3)
  259. IF VAL(a$(3))=id THEN LSET a$(6)=a$(1)
  260. LSET a$(7)="0"
  261. LSET a$(8)="3"
  262.  
  263. PUT #2,Playing
  264.  
  265. FinishPlay:
  266. CLOSE #2
  267. GOSUB AnyKey
  268.  
  269. RETURN
  270.  
  271. REM ******************************************************************
  272. join:
  273. REM ******************************************************************
  274.  
  275. o$=cr$+"Okay! One moment...":GOSUB modem.out
  276. GOSUB CheckNoGames
  277. IF nogames >= maxgames THEN
  278.   o$=cr$+cr$+cr$+ansi$(1)+"You are already active in"+STR$(nogames)+" games.":GOSUB modem.out
  279.   o$=cr$+cr$+ansi$(3)+"Sorry, but you can't join in any more!!!":GOSUB modem.out
  280.   GOSUB AnyKey
  281.   RETURN
  282. END IF
  283.  
  284. GOSUB opengames
  285. GOSUB ClearScreen
  286. o$=cr$+ansi$(5)+"Games waiting on other players:-":GOSUB modem.out
  287. o$=cr$+cr$+ansi$(1)+"Game Opponent                   Started":GOSUB modem.out
  288. o$=cr$+ansi$(2)+"~~~~ ~~~~~~~                    ~~~~~~~~~":GOSUB modem.out
  289. k2!=1
  290. FOR k=1 TO 99
  291.   IF INT(k2!/20)=k2!/20 THEN
  292.   o$=cr$+cr$+ansi$(7)+"More (Y/n)? ":in=3:il=1:YES=1:GOSUB modem
  293.   IF in$="NO" THEN makesure
  294. END IF
  295.  
  296. GET #2,k
  297. IF VAL(a$(8))=1 THEN 
  298.   o$=cr$+ansi$(2)+STR$(k)
  299.   IF k<10 THEN o$=o$+" "
  300.   o$=o$+"  "
  301.   o$=o$+ansi$(3)+a$(2)+SPACE$(27-LEN(a$(2)))+ansi$(6)+a$(5)
  302.   GOSUB modem.out
  303.   k2!=k2!+1
  304. END IF
  305. NEXT k
  306.  
  307. makesure:
  308. o$=cr$+cr$+ansi$(1)+"Join Which Game Number? (0 to Exit) ":in=4:il=2:GOSUB modem
  309. joinup=VAL(in$)
  310. IF joinup=0 THEN CLOSE#2:RETURN
  311.  
  312. GET #2,joinup
  313. IF VAL(a$(8))=1 THEN 
  314.   REM a game with 1 player waiting
  315.   IF VAL(a$(1))=id THEN o$=cr$+cr$+ansi$(1)+"Sorry, you can't play yourself!":GOSUB modem.out:GOTO makesure
  316.   LSET a$(3)=STR$(id)
  317.   LSET a$(4)=uname$
  318.   LSET a$(5)=DATE$
  319.   LSET a$(6)=STR$(id)
  320.   LSET a$(7)=STR$(17)
  321.   LSET a$(8)="2"
  322.  
  323.   PUT #2, joinup
  324.   o$=cr$+ansi$(3)+"You have now joined game"+STR$(joinup)+" and can now have the first move!":GOSUB modem.out
  325.   CLOSE #2
  326.   RETURN  
  327. ELSE
  328.   o$=cr$+ansi$(3)+"Sorry, that game is not available to join!":GOSUB modem.out
  329.   GOTO makesure
  330. END IF
  331.  
  332. REM ******************************************************************
  333. begin:
  334. REM ******************************************************************
  335.  
  336. GOSUB CheckNoGames
  337. o$=cr$+cr$+ansi$(5)+"You are involved in"+STR$(nogames)+" games.":GOSUB modem.out
  338. o$=cr$+cr$+ansi$(1)+"Are you SURE you wish to start a new game (Y/n)? ":GOSUB modem.out
  339. in=3:il=1:YES=1:GOSUB modem.in
  340. IF in$="NO" THEN notsure  'returns you straight off
  341.  
  342. IF nogames >= maxgames THEN
  343.  o$=cr$+cr$+cr$+ansi$(1)+"You are already active in"+STR$(maxgames)+" games.":GOSUB modem.out
  344.  o$=cr$+cr$+ansi$(3)+"Sorry, but you can't join in any more!!!":GOSUB modem.out
  345.  GOSUB AnyKey
  346.  RETURN
  347. END IF
  348.  
  349. GOSUB opengames
  350. count=0
  351.  
  352. findgame:
  353. count=count+1
  354. IF count=99 THEN 
  355.  o$=cr$+cr$+cr$+ansi$(1)+"There are already 99 active games.":GOSUB modem.out
  356.  o$=cr$+cr$+ansi$(3)+"Sorry, but you can't start any more!!!":GOSUB modem.out
  357.  GOSUB AnyKey
  358.  RETURN
  359. END IF
  360.  
  361. GET #2, count
  362. IF VAL(a$(8))<>0 THEN findgame
  363. o$=cr$+cr$+ansi$(6)+"You have now commenced game #"+STR$(count):GOSUB modem.out
  364. o$=cr$+cr$+ansi$(5)+"Let's hope someone else joins in soon!":GOSUB modem.out
  365.  
  366. LSET a$(0)="0"
  367. LSET a$(1)=STR$(id)
  368. LSET a$(2)=uname$
  369. LSET a$(3)="0"
  370. LSET a$(4)=" "
  371. LSET a$(5)=DATE$
  372. LSET a$(6)="0"
  373. LSET a$(7)="17"
  374. LSET a$(8)="1"
  375.  
  376. PUT #2,count
  377. CLOSE #2
  378. notsure:
  379. RETURN
  380.  
  381. REM ******************************************************************
  382. status:
  383. REM ******************************************************************
  384.  
  385. GOSUB ClearScreen
  386. o$=cr$+ansi$(2)+"OVERALL NIM GAMES STATUS:"+cr$:GOSUB modem.out
  387. o$=cr$+ansi$(1)+" #   Player 1                   Player 2                   Date Last Go":GOSUB modem.out
  388. o$=cr$+ansi$(3)+"~~~  ~~~~~~~~~~~~~~~~~~~~~~~~~  ~~~~~~~~~~~~~~~~~~~~~~~~~  ~~~~~~~~~~~~":GOSUB modem.out
  389.  
  390. GOSUB opengames
  391. count!=0
  392. FOR k=1 TO 99
  393.   GET #2,k
  394.   IF VAL(a$(8))<1 THEN NoInterest
  395.   count!=count!+1
  396.   o$=cr$+ansi$(1)+STR$(k)
  397.   IF k<10 THEN o$=o$+" "
  398.   o$=o$+ansi$(2)+"  "+a$(2)+SPACE$(27-LEN(a$(2)))+ansi$(3)+a$(4)+SPACE$(27-LEN(a$(4)))+ansi$(6)+a$(5)
  399.   GOSUB modem.out
  400.   o$=cr$+ansi$(5)
  401.  
  402.   IF VAL(a$(8))=1 THEN o$=o$+"     Game WAITING for another player to join."
  403.   IF VAL(a$(8))=2 THEN
  404.     o$=o$+"     Game in PROGRESS, waiting for "
  405.     IF VAL(a$(1))=VAL(a$(6)) THEN o$=o$+a$(2)
  406.     IF VAL(a$(3))=VAL(a$(6)) THEN o$=o$+a$(4)
  407.   END IF
  408.   IF VAL(a$(8))=3 THEN
  409.     o$=o$+"     Game WON by "
  410.     IF VAL(a$(1))=VAL(a$(6)) THEN o$=o$+a$(2)
  411.     IF VAL(a$(3))=VAL(a$(6)) THEN o$=o$+a$(4)
  412.   END IF
  413.   
  414.   o$=o$+cr$:GOSUB modem.out
  415.   IF count!/6=INT(count!/6) THEN
  416.     o$=cr$+ansi$(7)+"More (Y/n)? ":GOSUB modem.out
  417.     in=3:il=1:YES=1:GOSUB modem.in
  418.     IF in$="NO" THEN NoMore
  419.     o$=cr$+cr$+cr$+ansi$(1)+" #   Player 1                   Player 2                   Date Last Go":GOSUB modem.out
  420.     o$=cr$+ansi$(3)+"~~~  ~~~~~~~~~~~~~~~~~~~~~~~~~  ~~~~~~~~~~~~~~~~~~~~~~~~~  ~~~~~~~~~~~~":GOSUB modem.out
  421.   END IF
  422.   
  423. NoInterest:
  424. NEXT
  425.  
  426. NoMore:
  427. GOSUB AnyKey
  428. CLOSE #2
  429. RETURN
  430.  
  431. REM ******************************************************************
  432. YourStat:
  433. REM ******************************************************************
  434.  
  435. GOSUB ClearScreen
  436. o$=cr$+ansi$(2)+"THE GAMES YOU ARE INVOLVED IN: "+cr$:GOSUB modem.out
  437.  
  438. o$=cr$+ansi$(1)+" #   Player 1                   Player 2                   Date Last Go":GOSUB modem.out
  439. o$=cr$+ansi$(3)+"~~~  ~~~~~~~~~~~~~~~~~~~~~~~~~  ~~~~~~~~~~~~~~~~~~~~~~~~~  ~~~~~~~~~~~~":GOSUB modem.out
  440.  
  441. GOSUB opengames
  442. count!=0
  443. FOR k=1 TO 99
  444.   GET #2,k
  445.   IF VAL(a$(8))<1 THEN NotInterested
  446.   IF VAL(a$(1))<>id AND VAL(a$(3))<>id THEN NotInterested
  447.   count!=count!+1
  448.   o$=cr$+ansi$(1)+STR$(k)
  449.   IF k<10 THEN o$=o$+" "
  450.   o$=o$+ansi$(2)+"  "+a$(2)+SPACE$(27-LEN(a$(2)))+ansi$(3)+a$(4)+SPACE$(27-LEN(a$(4)))+ansi$(6)+a$(5)
  451.   GOSUB modem.out
  452.   o$=cr$+ansi$(5)
  453.  
  454.   IF VAL(a$(8))=1 THEN o$=o$+"     Game WAITING for another player to join."
  455.   IF VAL(a$(8))=2 THEN
  456.     o$=o$+"     Game in PROGRESS, waiting for "
  457.     IF VAL(a$(1))=VAL(a$(6)) THEN o$=o$+a$(2)
  458.     IF VAL(a$(3))=VAL(a$(6)) THEN o$=o$+a$(4)
  459.   END IF
  460.   IF VAL(a$(8))=3 THEN
  461.     o$=o$+"     Game WON by "
  462.     IF VAL(a$(1))=VAL(a$(6)) THEN o$=o$+a$(2)
  463.     IF VAL(a$(3))=VAL(a$(6)) THEN o$=o$+a$(4)
  464.   END IF
  465.   
  466.   o$=o$+cr$:GOSUB modem.out
  467.   IF count!/6=INT(count!/6) THEN
  468.     o$=cr$+ansi$(7)+"More (Y/n)? ":GOSUB modem.out
  469.     in=3:il=1:YES=1:GOSUB modem.in
  470.     IF in$="NO" THEN NoMore2
  471.     o$=cr$+cr$+cr$+ansi$(1)+" #   Player 1                   Player 2                   Date Last Go":GOSUB modem.out
  472.     o$=cr$+ansi$(3)+"~~~  ~~~~~~~~~~~~~~~~~~~~~~~~~  ~~~~~~~~~~~~~~~~~~~~~~~~~  ~~~~~~~~~~~~":GOSUB modem.out
  473.   END IF
  474.   
  475. NotInterested:
  476. NEXT
  477.  
  478. NoMore2:
  479. GOSUB AnyKey
  480. CLOSE #2
  481.  
  482. RETURN
  483.  
  484. REM ******************************************************************
  485. View:
  486. REM ******************************************************************
  487.  
  488. GOSUB ClearScreen
  489. GOSUB opengames
  490.  
  491. ViewTop:
  492. o$=cr$+cr$+ansi$(1)+"Which game number would you like to view (0 to exit)? ":in=4:il=2:GOSUB modem
  493. ViewGame=VAL(in$)
  494. IF ViewGame<1 THEN FinView
  495. GET #2,ViewGame
  496. IF VAL(a$(8))<>2 THEN
  497.   o$=cr$+ansi$(2)+"Sorry, that game is not in progress at the moment."+cr$:GOSUB modem.out
  498.   GOTO ViewTop
  499. END IF
  500.  
  501. GOSUB ClearScreen
  502. GET #2,ViewGame
  503. NoLeft=VAL(a$(7))
  504. flnm$=path$+"GameImgs/Nim"+STR$(NoLeft)
  505. IF ansi=1 THEN flnm$=flnm$+".1" ELSE flnm$=flnm$+".0"
  506. IF  ibm=1 THEN flnm$=flnm$+".1" ELSE flnm$=flnm$+".0"
  507. GOSUB fileout
  508.  
  509. o$=cr$+cr$+ansi$(7)+"Game"+STR$(ViewGame)+":"+cr$+"~~~~~~~":GOSUB modem.out
  510. o$=cr$+ansi$(3)+a$(2)+" Vs         "+ansi$(6)+a$(4):GOSUB modem.out
  511. o$=cr$+cr$+ansi$(5)+"There are "+STR$(NoLeft)+" objects remaining.":GOSUB modem.out
  512. o$=cr$+ansi$(2)+"The last go was made on "+a$(5)+"."
  513. IF VAL(a$(6))=VAL(a$(1)) THEN o$=cr$+ansi$(1)+"It is waiting on "+a$(2):GOSUB modem.out   
  514. IF VAL(a$(6))=VAL(a$(3)) THEN o$=cr$+ansi$(1)+"It is waiting on "+a$(4):GOSUB modem.out   
  515. GOSUB AnyKey
  516.  
  517. FinView:
  518. CLOSE #2
  519. RETURN
  520.  
  521. REM ******************************************************************
  522. instruct:
  523. REM ******************************************************************
  524.  
  525. GOSUB ClearScreen
  526. IF ansi=0 AND ibm=0 THEN flnm$=path$+"nim.inst.0.0"
  527. IF ansi=0 AND ibm=1 THEN flnm$=path$+"nim.inst.0.1"
  528. IF ansi=1 AND ibm=0 THEN flnm$=path$+"nim.inst.1.0"
  529. IF ansi=1 AND ibm=1 THEN flnm$=path$+"nim.inst.1.1"
  530. flnm$=flnm$+".1"
  531. GOSUB fileout
  532. GOSUB AnyKey
  533. GOSUB ClearScreen
  534.  
  535. IF ansi=0 AND ibm=0 THEN flnm$=path$+"nim.inst.0.0"
  536. IF ansi=0 AND ibm=1 THEN flnm$=path$+"nim.inst.0.1"
  537. IF ansi=1 AND ibm=0 THEN flnm$=path$+"nim.inst.1.0"
  538. IF ansi=1 AND ibm=1 THEN flnm$=path$+"nim.inst.1.1"
  539. flnm$=flnm$+".2"
  540. GOSUB fileout
  541. GOSUB AnyKey
  542. GOSUB ClearScreen
  543.  
  544. RETURN
  545.  
  546. REM ******************************************************************
  547. About:
  548. REM ******************************************************************
  549.  
  550. GOSUB ClearScreen
  551. IF ansi=0 AND ibm=0 THEN flnm$=path$+"nim.about.0.0"
  552. IF ansi=0 AND ibm=1 THEN flnm$=path$+"nim.about.0.1"
  553. IF ansi=1 AND ibm=0 THEN flnm$=path$+"nim.about.1.0"
  554. IF ansi=1 AND ibm=1 THEN flnm$=path$+"nim.about.1.1"
  555. GOSUB fileout
  556. GOSUB AnyKey
  557.  
  558. RETURN
  559.  
  560. REM ******************************************************************
  561. PrintMenu:
  562. REM ******************************************************************
  563.  
  564. GOSUB ClearScreen
  565. IF ansi=0 AND ibm=0 THEN flnm$=path$+"nim.menu.0.0"
  566. IF ansi=0 AND ibm=1 THEN flnm$=path$+"nim.menu.0.1"
  567. IF ansi=1 AND ibm=0 THEN flnm$=path$+"nim.menu.1.0"
  568. IF ansi=1 AND ibm=1 THEN flnm$=path$+"nim.menu.1.1"
  569. GOSUB fileout
  570.  
  571. RETURN
  572.  
  573. REM ******************************************************************
  574. ChangeSetup:
  575. REM ******************************************************************
  576.  
  577. GOSUB ClearScreen
  578. GOSUB AnsiCheck
  579. GOSUB IBMCheck
  580. RETURN
  581.  
  582. REM ******************************************************************
  583. Maintenance:
  584. REM ******************************************************************
  585.  
  586. GOSUB ClearScreen
  587. o$=cr$+"Sysop Maintenance":GOSUB modem.out
  588. o$=cr$+cr$+"This allows you to reset any of the games.":GOSUB modem.out
  589. o$=cr$+cr$+"Enter the maintenance password: ":GOSUB modem.out
  590. in=2:il=30:GOSUB modem.in
  591. IF in$<>password$ THEN o$=cr$+cr$+"Password wrong!!":GOSUB modem.out:GOTO FinMaint
  592. IF lev<9 THEN o$=cr$+cr$+"SHAME ON YOU! You're not the Sysop, anyway!":GOSUB modem.out:GOTO FinMaint
  593.  
  594. ' you're in!
  595.  
  596. GOSUB opengames
  597.  
  598. Maintloop:
  599. o$=cr$+"Which game to reset? (0 to Exit) ":GOSUB modem.out
  600. in=4:il=2:GOSUB modem.in
  601. ResetGame=VAL(in$)
  602. IF ResetGame<1 THEN FinMaint
  603. GET #2,ResetGame
  604.  
  605. o$=cr$+cr$+a$(2)+" Vs "+a$(4)+" Last Go: "+a$(5):GOSUB modem.out
  606. o$=cr$+cr$+"Shall we reset this one (y/N)? ":in=3:il=1:YES=0:GOSUB modem
  607. IF in$<> "YES" THEN Maintloop
  608. o$=cr$+cr$+"Are you absolutely sure (Y/n)? ":in=3:il=1:YES=1:GOSUB modem
  609. IF in$<> "YES" THEN Maintloop
  610.  
  611. LSET a$(0)="0"
  612. LSET a$(1)="0"
  613. LSET a$(2)=" "
  614. LSET a$(3)="0"
  615. LSET a$(4)=" "
  616. LSET a$(5)="Never"
  617. LSET a$(6)="0"
  618. LSET a$(7)="17"
  619. LSET a$(8)="0"
  620.  
  621. PUT #2,ResetGame
  622.  
  623. o$=cr$+cr$+"Okay, that game has been cleared!":GOSUB modem.out
  624.  
  625. GOTO Maintloop
  626.  
  627. FinMaint:
  628.  
  629. CLOSE #2
  630. RETURN
  631.  
  632. REM ******************************************************************
  633. quit:
  634. REM ******************************************************************
  635.  
  636. GOSUB ClearScreen
  637.  
  638. IF ansi=0 AND ibm=0 THEN flnm$=path$+"nim.bye.0.0"
  639. IF ansi=0 AND ibm=1 THEN flnm$=path$+"nim.bye.0.1"
  640. IF ansi=1 AND ibm=0 THEN flnm$=path$+"nim.bye.1.0"
  641. IF ansi=1 AND ibm=1 THEN flnm$=path$+"nim.bye.1.1"
  642.  
  643. GOSUB fileout
  644. GOSUB AnyKey
  645.  
  646. GOTO BYE
  647.  
  648. '
  649. '
  650. REM Big Trouble if you get here!
  651.  
  652. GOTO BYE
  653.  
  654. REM ******************************************************************
  655. REM Program Subroutines follow...
  656. REM ******************************************************************
  657.  
  658.  
  659. REM ******************************************************************
  660. opengames:
  661. REM ******************************************************************
  662.  
  663. flnm$=path$+"nim.games"
  664.  
  665. OPEN flnm$ AS #2 LEN=83
  666. FIELD #2, 4 AS a$(0), 5 AS a$(1), 25 AS a$(2), 5 AS a$(3),25 AS a$(4), 10 AS a$(5), 5 AS a$(6), 3 AS a$(7), 1 AS a$(8)
  667. RETURN
  668.  
  669. REM ******************************************************************
  670. CheckNoGames:
  671. REM ******************************************************************
  672.  
  673. REM Search for games the player is involved in:
  674. nogames=0
  675.  
  676. GOSUB opengames
  677. FOR J=1 TO 99
  678.  
  679. GET #2,J
  680. IF (VAL(a$(1))=id OR VAL(a$(3))=id) THEN
  681.  IF (VAL(a$(8))=2 OR VAL(a$(8))=1) THEN
  682.   nogames=nogames+1
  683.  END IF
  684. END IF
  685.  
  686. NEXT J
  687.  
  688. CLOSE #2
  689. RETURN
  690.  
  691.  
  692.  
  693. REM ******************************************************************
  694. Woops:
  695. REM ******************************************************************
  696.  
  697.  IF ERR=53 THEN
  698.   o$=cr$+cr$+"Sorry, I Can't Find The File I Need!":GOSUB modem.out
  699.   o$=cr$+"The sysop has not setup his directory properly,":GOSUB modem.out
  700.   o$=cr$+"but a note has been made of which file was missing.":GOSUB modem.out
  701.   o$=cr$+"Humble Apologies, but I think it safer if we now quit!":GOSUB modem.out
  702.   eflnm$=path$+"Nim.Errors"
  703.   OPEN eflnm$ FOR APPEND AS 6
  704.   prob$="Couldn't find "+flnm$+" at line #"+STR$(ERL)+" at "+TIME$+" on "+DATE$
  705.   PRINT #6,prob$
  706.   CLOSE #6
  707.   GOTO BYE
  708.  END IF
  709.  
  710.  o$=cr$+cr$+"Oh Dear! We have had a really bad error occur.":GOSUB modem.out
  711.  o$=cr$+"There has been a note made of the error in the Nim directory.":GOSUB modem.out
  712.  o$=cr$+"Sorry!!  Nim will now quit.":GOSUB modem.out
  713.   eflnm$=path$+"Nim.Errors"
  714.   OPEN eflnm$ FOR OUTPUT AS 6
  715.   prob$="Error "+STR$(ERR)+" at LINE #"+STR$(ERL)+" at "+TIME$+" ON "+DATE$
  716.   PRINT #6,prob$
  717.   CLOSE #6
  718. GOTO BYE
  719.  
  720. REM ******************************************************************
  721. REM My DRoutines now follow
  722. REM ******************************************************************
  723.  
  724. fileout:
  725.  
  726. CLOSE #9
  727. OPEN flnm$ FOR INPUT AS 9
  728.   WHILE EOF(9)<>-1
  729.     LINE INPUT #9, o$
  730.     o$=cr$+o$
  731.     GOSUB modem.out
  732.   WEND
  733. CLOSE #9
  734. RETURN
  735.  
  736. REM ******************************************************************
  737. AnyKey:
  738. REM ******************************************************************
  739.  
  740. GOSUB TimeCheck
  741.  
  742. o$=cr$+cr$+ansi$(7)+"                               >>> Tap a key <<< "+cr$:GOSUB modem.out
  743. GOSUB timecheck
  744. in=0:il=1
  745. GOSUB modem.in
  746. RETURN
  747.                                                            
  748. REM ******************************************************************
  749. AnsiCheck:
  750. REM ******************************************************************
  751.  
  752. o$=cr$+cr$+"Do you want ANSI colours (Y/n)? ":GOSUB modem.out
  753. in=3:il=3:YES=1:GOSUB modem.in
  754. IF in$="YES" THEN ansi=1 ELSE ansi=0
  755.  
  756. IF ansi=1 THEN   
  757.     ansi$(0)=esc$+"[30m"
  758.     ansi$(1)=esc$+"[31m"
  759.     ansi$(2)=esc$+"[32m"
  760.     ansi$(3)=esc$+"[33m"
  761.     ansi$(4)=esc$+"[34m"
  762.     ansi$(5)=esc$+"[35m"
  763.     ansi$(6)=esc$+"[36m"
  764.     ansi$(7)=esc$+"[37m"
  765.     ansi$(8)=CHR$(12)
  766.     ansi$(9)=CHR$(0)        :REM SPARE
  767.     ansi$(10)=esc$+"[0m"
  768. END IF
  769.  
  770. IF ansi<>1 THEN  
  771.     ansi$(0)=""
  772.     ansi$(1)=""       :REM If you don't want ANSI
  773.     ansi$(2)=""       :REM You get NUTHINK!! :-)
  774.     ansi$(3)=""
  775.     ansi$(4)=""
  776.     ansi$(5)=""
  777.     ansi$(6)=""
  778.     ansi$(7)=""
  779.     ansi$(8)=""
  780.     ansi$(9)=""
  781.     ansi$(10)=""
  782. END IF
  783.  
  784. RETURN
  785.  
  786.  
  787. REM ******************************************************************
  788. IBMCheck:
  789. REM ******************************************************************
  790.  
  791. o$=cr$+cr$+"Do you want IBM Graphics Characters (Y/n)? ":GOSUB modem.out
  792. in=3:il=3:YES=1:GOSUB modem.in
  793. IF in$="YES" THEN ibm=1 ELSE ibm=0
  794.  
  795. RETURN
  796.  
  797.  
  798. REM ******************************************************************
  799. ClearScreen:
  800. REM ******************************************************************    
  801.                                                   
  802. GOSUB timecheck
  803.  
  804. IF ansi=0 AND ibm=0 THEN
  805.  o$=cr$+cr$+cr$+cr$+cr$+cr$+cr$+cr$+cr$+cr$+cr$+cr$+cr$+cr$+cr$+cr$+cr$+cr$+cr$+cr$+cr$+cr$+cr$+c$+cr$+cr$+cr$
  806.  GOSUB modem.out
  807. END IF
  808.  
  809. IF ansi=0 AND ibm=1 THEN
  810.  o$=CHR$(12)
  811.  GOSUB modem.out
  812.  CLS
  813. END IF
  814.  
  815. IF ansi=1 AND ibm=1 THEN
  816.  o$=CHR$(12)
  817.  GOSUB modem.out
  818.  CLS
  819. END IF
  820.  
  821. IF ansi=1 AND ibm=0 THEN
  822.  o$=CHR$(12)
  823.  GOSUB modem.out
  824.  CLS
  825. END IF
  826.  
  827. RETURN
  828.  
  829.  
  830.  
  831. REM ******************************************************************
  832. REM Percy's DRoutines now follow. Thanks Perc!
  833. REM ******************************************************************
  834.  
  835.  
  836. BYE:
  837. o$=cr$+cr$+"Hope to see you back soon!":GOSUB modem.out:GOSUB delay1
  838. KILL "RAM:USERDATA":WINDOW CLOSE 1:GOSUB modem.c:CLEAR:END
  839.  
  840. modem:
  841. GOSUB modem.out:GOSUB modem.in:RETURN
  842.  
  843. modem.out:
  844. PRINT o$;:IF ring=1 AND no.out=0 THEN PRINT#1,o$;
  845. o$="":RETURN
  846.  
  847. modem.in:
  848. idle=TIMER:key$="":in$="":a$="":mi$="":a=0:keyy=0:b=0
  849. WHILE keyy<>1
  850. key$=INKEY$:IF key$<>"" THEN mod.in1
  851.  IF ring=1 THEN
  852.    cd=PEEKL(12570624&):cd=cd AND 8192
  853.    IF cd<>0 THEN BYE
  854.    IF LOC(1) THEN a$=INPUT$(1,1):key$=a$
  855.    END IF
  856.  
  857. mod.in1:
  858. IF key$=CHR$(19) THEN
  859. pause=TIMER:hold=1:WHILE hold<>0
  860. IF LOC(1)>0 THEN key$=INPUT$(1,1) ELSE key$=INKEY$
  861. IF key$=CHR$(17) OR key$=CHR$(13) THEN hold=0
  862. IF TIMER>pause+30 THEN key$=CHR$(17):hold=0
  863. WEND
  864. END IF
  865. mod.in1.1:
  866. IF key$="" THEN mod.in2
  867. mod.in1.5:
  868. a=ASC(key$):b=LEN(in$):IF a=13 THEN mod.in1.6
  869. IF (a=8 OR a=127) AND LEN(in$)>=1 THEN in$=LEFT$(in$,b-1):b=b-1:o$=de$:GOSUB modem.out
  870. IF b=il THEN mod.in2
  871. IF in=0 THEN
  872. IF a>31 AND a<127 THEN
  873. key$=UCASE$(key$):o$=key$+cr$:GOSUB modem.out:in$=key$:keyy=1
  874. END IF
  875. END IF
  876. mod.in1.6:
  877. IF in=1 AND a>31 AND a<127 THEN o$=key$:GOSUB modem.out:in$=in$+key$
  878. IF in=2 AND a>31 AND a<127 THEN key$=UCASE$(key$):o$=key$:GOSUB modem.out:in$=in$+key$
  879. IF in=3 THEN
  880. IF a=13 AND YES=1 THEN o$="YES":GOSUB modem.out:in$="YES":keyy=1
  881. IF a=13 AND YES=0 THEN o$="NO":GOSUB modem.out:in$="NO":keyy=1
  882. IF a=89 OR a=121 THEN o$="YES"+cr$:GOSUB modem.out:in$="YES":keyy=1
  883. IF a=78 OR a=110 THEN o$="NO"+cr$:GOSUB modem.out:in$="NO":keyy=1
  884. END IF
  885. IF in=4 AND a>47 AND a<58 THEN o$=key$:GOSUB modem.out:in$=in$+key$
  886. IF a=13 THEN o$=cr$:GOSUB modem.out:keyy=1
  887. mod.in2:
  888. IF TIMER>idle+300 THEN
  889. IF (Sysop=1 OR term=1) AND logon=0 AND TIMER>idle+600 THEN BYE
  890. IF lev>7 AND TIMER>idle+600 THEN BYE
  891. IF lev<8 THEN BYE
  892. END IF
  893. mod.in2.0:
  894. WEND
  895. IF ring=1 THEN
  896. WHILE LOC(1)>0:a$=INPUT$(1,1):mi$=mi$+a$:WEND
  897. FOR pu=1 TO LEN(mi$)
  898. IF MID$(mi$,pu,5)="ARRIE" OR MID$(mi$,pu,1)=null$ THEN BYE
  899. NEXT
  900. END IF
  901. mod.in2.1:
  902. RETURN
  903.  
  904. time1:
  905. t.t=FRE(0):time1$=TIME$:t.t=VAL(LEFT$(time1$,2))
  906. IF t.t>11 THEN a$=" PM"
  907. IF t.t<12 THEN a$=" AM"
  908. IF t.t=0 THEN t.t=12:time1$=RIGHT$(STR$(t.t),2)+RIGHT$(time1$,6):GOTO timeout
  909. IF t.t<10 THEN time1$=RIGHT$(STR$(t.t),1)+RIGHT$(time1$,6):GOTO timeout
  910. IF t.t>21 THEN t.t=t.t-12:time1$=RIGHT$(STR$(t.t),2)+RIGHT$(time1$,6):GOTO timeout
  911. IF t.t>12 THEN t.t=t.t-12:time1$=RIGHT$(STR$(t.t),1)+RIGHT$(time1$,6)
  912. timeout:
  913. time1$=time1$+a$+"  "+DATE$:RETURN
  914.  
  915. timecheck:
  916. GOSUB time1:IF TIMER<timeon+(tpc*60) THEN
  917. timenow=TIMER:ctime=(timenow-timeon):ctime=CINT(ctime/60):rtime=tpc-ctime:RETURN
  918. END IF
  919. o$=cr$+cr$+cr$+"Sorry, Call Time Limit Exceeded! Call Back Later, Please!":GOSUB modem.out:GOTO BYE
  920.  
  921. delay1:
  922. pause=TIMER:WHILE TIMER<pause+2:WEND:RETURN
  923.  
  924. modem.c:
  925. IF ring=1 THEN TIMER OFF
  926. GOSUB delay1:CLOSE#1:RETURN
  927.  
  928. modem.o:
  929. CLOSE#1:OPEN "COM1:"+bd$+",n,8,1" AS #1 LEN=4096:GOSUB delay1:IF ring=1 THEN TIMER ON
  930. RETURN
  931.  
  932. sendnull:
  933. PRINT#1,null$;:RETURN
  934.